package com.wno704.quartz.task;

import com.wno704.quartz.entity.Job;
import com.wno704.quartz.service.JobService;
import com.wno704.system.util.GroovyUtil;
import com.wno704.system.util.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @ClassName GroovyTask
 * @Description TODO
 * @Author wno704
 * @Date 2022/8/25 22:08
 * @Version 1.0
 */
@Slf4j
@Component
public class GroovyTask {

    @Autowired
    private JobService jobService;

    public void groovyDeal(String params) {
        Job job = jobService.findJob(Long.parseLong(params));
        log.info("{}-{}----start", job.getRemark(), "groovyDeal");
        log.info("{}----{}----{}----{}----{}----{}----{}", params, job.getTemplateSrcName(), job.getTemplateDstName(), job.getTemplateDstTwoName(), job.getSrcCommd(), job.getDstCommd(), job.getDstTwoCommd());

        //1: A库查询结果---通过Groovy处理
        if (job.getTransType().equals("1")) {
            transDataFromSrcToGroovyB(job);
        }

        //2: A库查询结果---通过Groovy处理--更新C库
        else if (job.getTransType().equals("2")) {
            transDataFromSrcToGroovyBToDstTwo(job);
        }

        //3: 通过Groovy处理--更新B库
        else if (job.getTransType().equals("3")) {
            transDataFromGroovyAToDst(job);
        }

        //4: 通过Groovy处理--更新B/C库
        else if (job.getTransType().equals("4")) {
            transDataFromGroovyAToDstAndDstTwo(job);
        }

        //5: Groovy-A处理/Groovy-B处理/Groovy-C处理
        else if (job.getTransType().equals("5")) {
            groovyAorBorC(job);
        }

        //6: 通过GroovyA处理----查询B库---B库结果通过GroovyC处理
        else if (job.getTransType().equals("6")) {
            transDataFromSrcGroovyToDstDbToDstTwoGroovy(job);
        }


        //7: A库处理  --  GroovyB执行-------更新C库
        else if (job.getTransType().equals("7")) {
            transDataFromSrcDealGroovyToDstTwoDb(job);
        }


        log.info("{}-{}----end", job.getRemark(), "groovyDeal");
    }

    //7：A库处理  --  GroovyB执行-------更新C库
    private void transDataFromSrcDealGroovyToDstTwoDb(Job job) {
        JdbcTemplate jdbcTemplateSrc = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateSrcName());
        JdbcTemplate jdbcTemplateTwoDst = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateDstTwoName());
        String srcCmd = job.getSrcCommd();
        String dstCmd = job.getDstCommd();
        String dstTwoCmd = job.getDstTwoCommd();
        jdbcTemplateSrc.update(srcCmd);
        List<Object[]> listDst = (List<Object[]>) GroovyUtil.executeGroovy(GroovyUtil.parseClass(dstCmd), "");
        int[] ans = jdbcTemplateTwoDst.batchUpdate(dstTwoCmd, listDst);
    }

    //6通过GroovyA处理-----查询B库---通过GroovyC处理
    private void transDataFromSrcGroovyToDstDbToDstTwoGroovy(Job job) {
        String srcCmd = job.getSrcCommd();
        JdbcTemplate jdbcTemplateDst = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateDstName());
        String dstCmd = job.getDstCommd();
        String dstTwoCmd = job.getDstTwoCommd();

        List<Map<String, Object>> srcData = (List<Map<String, Object>>) GroovyUtil.executeGroovy(GroovyUtil.parseClass(srcCmd), "");

        if (srcData.size() > 0) {
            for (Map<String, Object> mp : srcData) {
                List<Map<String, Object>> dstData = jdbcTemplateDst.queryForList(dstCmd, mp.values().toArray());
                if (dstData.size() > 0) {
                    GroovyUtil.executeGroovy(GroovyUtil.parseClass(dstTwoCmd), dstData);
                }
            }
        }
    }

    //5: Groovy-A处理/Groovy-B处理/Groovy-C处理
    private void groovyAorBorC(Job job) {
        String srcCmd = job.getSrcCommd();
        String dstCmd = job.getDstCommd();
        String dstTwoCmd = job.getDstTwoCommd();

        if (!(srcCmd == null || srcCmd.equals(""))) {
            GroovyUtil.executeGroovy(GroovyUtil.parseClass(srcCmd), "");
        }

        if (!(dstCmd == null || dstCmd.equals(""))) {
            GroovyUtil.executeGroovy(GroovyUtil.parseClass(dstCmd), "");
        }

        if (!(dstTwoCmd == null || dstTwoCmd.equals(""))) {
            GroovyUtil.executeGroovy(GroovyUtil.parseClass(dstTwoCmd), "");
        }
    }

    //4：通过Groovy处理--更新B/C库
    private void transDataFromGroovyAToDstAndDstTwo(Job job) {
        String srcCmd = job.getSrcCommd();
        JdbcTemplate jdbcTemplateDst = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateDstName());
        JdbcTemplate jdbcTemplateTwoDst = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateDstTwoName());
        String dstCmd = job.getDstCommd();
        String dstTwoCmd = job.getDstTwoCommd();

        List<Object[]> listDst = (List<Object[]>) GroovyUtil.executeGroovy(GroovyUtil.parseClass(srcCmd), "");

        int[] ans = jdbcTemplateDst.batchUpdate(dstCmd, listDst);
        int[] ansTwo = jdbcTemplateTwoDst.batchUpdate(dstTwoCmd, listDst);
    }

    //3：通过Groovy处理--更新B库
    private void transDataFromGroovyAToDst(Job job) {
        String srcCmd = job.getSrcCommd();
        JdbcTemplate jdbcTemplateDst = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateDstName());
        String dstCmd = job.getDstCommd();
        List<Object[]> listDst = (List<Object[]>) GroovyUtil.executeGroovy(GroovyUtil.parseClass(srcCmd), "");

        int[] ans = jdbcTemplateDst.batchUpdate(dstCmd, listDst);
    }

    //2：A库查询结果---通过Groovy处理--更新C库
    private void transDataFromSrcToGroovyBToDstTwo(Job job) {

        JdbcTemplate jdbcTemplateSrc = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateSrcName());
        JdbcTemplate jdbcTemplateTwoDst = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateDstTwoName());
        String srcCmd = job.getSrcCommd();
        String dstCmd = job.getDstCommd();
        String dstTwoCmd = job.getDstTwoCommd();
        List<Map<String, Object>> srcData = jdbcTemplateSrc.queryForList(srcCmd);
        List<Object[]> listDst = (List<Object[]>) GroovyUtil.executeGroovy(GroovyUtil.parseClass(dstCmd), srcData);
        int[] ans = jdbcTemplateTwoDst.batchUpdate(dstTwoCmd, listDst);
    }

    //1：A库查询结果---通过Groovy处理
    private void transDataFromSrcToGroovyB(Job job) {
        JdbcTemplate jdbcTemplateSrc = (JdbcTemplate) SpringContextUtil.getBean(job.getTemplateSrcName());
        String srcCmd = job.getSrcCommd();
        String dstCmd = job.getDstCommd();
        List<Map<String, Object>> srcData = jdbcTemplateSrc.queryForList(srcCmd);
        GroovyUtil.executeGroovy(GroovyUtil.parseClass(dstCmd), srcData);
    }

}
